package com.example.commonmistak.datetime;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;

/**
 * @author xiongwei
 * @date 2022/1/4 16:09
 */
public class DatetimeDemo {


    public static void main(String[] args) throws InterruptedException {
        format();
    }

    /**
     * 要正确处理国际化时间问题，我推荐使用 Java 8 的日期时间类，
     * 即使用 ZonedDateTime 保存时间，然后使用设置了 ZoneId 的 DateTimeFormatter 配合 ZonedDateTime 进行时间格式化得到本地时间表示。
     * 这样的划分十分清晰、细化，也不容易出错。
     */
    public static void timezone() {
        String stringDate = "2022-01-04 16:10:00";

        ZoneId zoneNY = ZoneId.of("America/New_York");
        ZoneId zoneSH = ZoneId.of("Asia/Shanghai");

        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");

        ZonedDateTime date = ZonedDateTime.of(LocalDateTime.parse(stringDate, dateTimeFormatter), zoneSH);

        DateTimeFormatter outputFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss Z");

        System.out.println(zoneNY.getId() + outputFormatter.withZone(zoneNY).format(date));
        System.out.println(zoneSH.getId() + outputFormatter.withZone(zoneSH).format(date));
    }

    private static SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    public static void format() throws InterruptedException {
        ExecutorService threadPool = Executors.newFixedThreadPool(100);
        for (int i = 0; i < 20; i++) {
            threadPool.execute(()->{
                for (int j = 0; j < 10; j++) {
                    try {
                        System.out.println(simpleDateFormat.parse("2020-01-01 11:12:13"));
                    } catch (ParseException e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        threadPool.shutdown();
        threadPool.awaitTermination(1, TimeUnit.HOURS);
    }
}
